package request

import (
	"errors"

	"github.com/gin-gonic/gin"
)

type PageRequest struct {
	Page     int    `form:"page" json:"page" binding:"omitempty,min=1"` // 页码
	PageSize int    `form:"page_size" json:"page_size"`                 // 每页条数
	Sort     string `form:"sort" json:"sort"`                           // 排序字段
	Order    string `form:"order" json:"order"`                         // 排序顺序
}

// Default 设置默认分页参数
func (p *PageRequest) Default() {
	if p.Page <= 0 {
		p.Page = 1
	}
	if p.PageSize <= 0 {
		p.PageSize = 10
	}
	if p.Sort != "" && p.Order == "" {
		p.Order = "desc"
	}
}

// Offset 计算数据库查询的偏移量
func (p *PageRequest) Offset() int {
	return (p.Page - 1) * p.PageSize
}

// Limit 计算数据库查询的限制条数（取多少条）
func (p *PageRequest) Limit() int {
	return p.PageSize
}

// Parse 解析并验证分页请求参数
func (p *PageRequest) Parse(c *gin.Context) (*PageRequest, error) {
	var req PageRequest

	// 从请求中绑定参数
	// ShouldBind()方法 根据请求自动选择绑定方式
	if err := c.ShouldBind(&req); err != nil {
		return nil, errors.New("参数错误：" + err.Error())
	}

	// 设置默认值
	req.Default()

	// 验证排序方向
	if req.Order != "" && req.Order != "asc" && req.Order != "desc" {
		return nil, errors.New("参数错误：order 参数 只能是 asc 或 desc")
	}

	return &req, nil
}